/**
 * Clase que simula una cola de banco
 * @author Diego Enriquez 10038
 */
public class Cola extends ACola<Cliente> {
	private ListaCircular<Integer> tiempos;
	/**
	 * crea una nueva cola
	 */
	public Cola(){
		tiempos = new ListaCircular<Integer>();
		datos = new ListaCircular<Cliente>();
		cont = 0;
	}
	
	/**}
	 * permite agregar un cliente a la cola
	 * @param cliente el cliente que va a ser agregado
	 * @param tActual el tiempo acutal en el banco
	 * @return devuelve un evento de salida, cuando se agrega el primer cliente a una cola
	 */
	public Evento add(Cliente cliente, int tActual){
		add(cliente);
		if (size()==1){
			return new Evento(tActual+cliente.getT2(), this);
		}
		else 
			return null;
	}
	
	/**
	 * Metodo que permite quitar el primer elemento
	 * @param tActual el tiempo actual en el banco
	 * @return devuelve un evento de salida, cuando el elemento que se borra no es el ultimo
	 */
	public Evento remove(int tActual){
		if (!isEmpty()){
			Cliente cliente = remove();
			cliente.calcTFinal(tActual);
			tiempos.addLast(cliente.getTFinal());
			if (!isEmpty()){
				cliente = peek();
				return new Evento(cliente.getT2()+tActual, this);
			}
			else
				return null;			
		}
		else
			return null;
	}
	
	/**
	 * Pernmite obtener el promedio de los tiempos de los clientes de la lista
	 * @return devuelve el promedio
	 */
	public double promedio(){
		double prom = 0;
		int cant = tiempos.size();
		while(!tiempos.isEmpty()){
			int t = tiempos.removeFirst();
			prom += t;
		}
		return prom;
	}
}
